package thread;

public class ThreadDemo15 {
    /**
     * 死锁
     * 两个线程两把锁，一个线程各对应一把锁，再获取另一个锁
     */
    public static void main1(String[] args) {
        Object jiangyou = new Object();
        Object cu = new Object();

        Thread t1 = new Thread(() -> {
            synchronized (jiangyou) {
                // 加入 sleep 都是为了让线程先把对应的第一个锁拿到
                // 加上休眠，表示让 jiangyou 的锁获取到之后，再获取 cu 的锁
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (cu) {
                    System.out.println("t1把酱油和醋都拿到了");
                }
            }
        });
        Thread t2 = new Thread(() -> {
            synchronized (cu) {
                // 加上休眠，表示让 cu 的锁获取到之后，再获取 jiangyou 的锁
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (jiangyou) {
                    System.out.println("t2把醋和酱油都拿到了");
                }
            }
        });

        t1.start();
        t2.start();
    }
    /**
     * 解决死锁：指定一个固定的顺序
     * 比如：都先拿 jiangyou 再拿 cu
     */
    public static void main(String[] args) {
        Object jiangyou = new Object();
        Object cu = new Object();

        Thread t1 = new Thread(() -> {
            synchronized (jiangyou) {
                // 加入 sleep 都是为了让线程先把对应的第一个锁拿到
                // 加上休眠，表示让 jiangyou 的锁获取到之后，再获取 cu 的锁
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (cu) {
                    System.out.println("t1把酱油和醋都拿到了");
                }
            }
        });
        Thread t2 = new Thread(() -> {
            synchronized (jiangyou) {
                // 加上休眠，表示让 cu 的锁获取到之后，再获取 jiangyou 的锁
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (cu) {
                    System.out.println("t2把醋和酱油都拿到了");
                }
            }
        });

        t1.start();
        t2.start();
    }
}
